﻿// ConsoleApplication8.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<regex>
#include<vector>

using namespace std;
int main()
{/*
    //匹配单个字符
    //匹配 通配符\\w =>匹配数字、字母、下划线
    //定义一个正则表达式
    string pattern = "\\w";
    //编译正则表达式
    regex reg(pattern);
    //定义普通字符串
    string ch = "H";
    //匹配函数regex_match
    //bool res = regex_match(ch, reg);
    //cout << res << endl;


    //获取返回匹配的结果
    //保存匹配结果
    smatch results;
    regex_match(ch, results, reg);
    cout << results.str() << endl;


    //通配符\\d =>只能匹配数字
    string pattern = "\\d";
    regex reg(pattern);
    string ch = "1";
    bool res = regex_match(ch, reg);*/


    //通配符\\s =>只能匹配空白
    // \\W  \\D  \\S 与\\w  \\d  \\s 相反


    //只匹配小写字母 []匹配括号中的任意字符
    //regex reg("[a-z]");
    // string ch = "a";
    //[ab]hello =>ahello regex reg("[a-z]");或 bhello
  /*  regex reg("[ab]hello");
    string ch = "ahello";
    smatch results;
    regex_match(ch, results, reg);
    cout << results.str() << endl;


    //多个字符匹配 * +
    //*匹配0个或多个  +匹配1个或多个
    //[ab]\\w+   [ab][a-z]+
    //regex_match从头到尾匹配
    //regex_search从目标字符串中查找匹配成功的字符 
    regex reg("[ab]\\w+");
    string ch = "cahello";//regex_match不能匹配 regex_search能匹配
    //string ch = "ahello";//能匹配
    string ch = "cahello bhello";//regex_search只能匹配出第一个ahello
    smatch results;
    //regex_match(ch, results, reg);//必须从头到尾符合才能匹配
    regex_search(ch, results, reg);//可以从中间搜索，只要有就能匹配
    cout << results.str() << endl;


    //通配符 . 任意字符除了换行符
    regex reg("[ab]\\.+");*/


   /* //字符串需要匹配开始位置 ^
    //字符串需要匹配结束位置 $
    //a开始  ahello 123ahello
    regex reg("^a[a-z]+");//必须以a开头
    //string ch = "ahello";
    string ch = "cahello bhello";
    string ch = "ahello bhello";
    smatch results;
    //regex_match(ch, results, reg);
    regex_search(ch, results, reg);
    cout << results.str() << endl;


    //字符串需要匹配结束位置 $
    //a开始  ahello 123ahello
    regex reg("b[a-z]+llo$");//以llo结尾
    regex reg("b[a-z]+llo$");//必须以b开头，以llo结尾
    //string ch = "ahello";
    //string ch = "cahello bhello";
    string ch = "ahello bhello";
    smatch results;
    //regex_match(ch, results, reg);
    regex_search(ch, results, reg);
    cout << results.str() << endl;


    //？匹配0个或1个
    //regex reg("\\d +");
    regex reg("\\d +?");
    string str = "hello 123 world 666";
    smatch results;
    regex_search(str, results, reg);
    cout << results.str() << endl;


    //贪心匹配
    //可以设置匹配字符的个数(n,m) n-m个 regex reg("b[a-z]+llo$");//以llo结尾
    regex reg("\\d{3,10}");
    string str = "hello 123 world 6661234";
    smatch results;
    regex_search(str, results, reg);
    cout << results.str() << endl;


    // ^a 开头   [^a]=>表示否定，不能匹配a字符
    regex reg("[^a]\\w+}");
    string str = "hello ";
    smatch results;
    regex_search(str, results, reg);
    cout << results.str() << endl;



    //练习
    //用正则表达式提取出合法的手机号，并不是以4和7结尾
    //手机号开头1
    //手机号11位
    //regex reg("^1\\d{9}[^47]");
    regex reg("^1\\d{9}[01235689]");
    vector<string>vt = { "12356","18282559937","13699301124","13699301125","13999301224" };
    smatch results;
    bool res;
    for (auto& v : vt) {
        res = regex_match(v, results, reg);
        if (res) {
            cout << results.str() << endl;
        }
    }*/

    /*string str = "python 90 php 88 java 95";
    string str = "python 90.5 php 88.5 java 95.5";
    regex reg("\\d+");
    regex reg("\\d+.\\d+");
    //迭代器的方式遍历
    sregex_iterator it(str.begin(), str.end(), reg);
    //迭代器末尾
    auto end_it = sregex_iterator();
    smatch result;
    while (it != end_it) {
        result = *it;
        cout << result.str() << endl;
        it++;
    }*/


}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
